package com.keio.handler;

import com.keio.common.protocol.ProxyMessage;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.EventLoopGroup;
import lombok.extern.slf4j.Slf4j;

/**
 * @Description 客户端
 * @author KEIO  on 2022/1/14.
 * @version 1.0
 */
@Slf4j
public class HeartBeatHandler extends ChannelInboundHandlerAdapter {

    //读超时是指     在指定时间内没有接收到任何数据
    //写超时是      指在指定时间内没有发送任何数据
    //将服务器端的读超时设置为60秒，客户端写超时设为50秒，客户端写超时则发送一个心跳包
    //因此服务器端与客户端如果正常连接则一定不会发生读超时
    //如果发生读超时则可能是网络延迟太高或者断线了，这时候就可以考虑断开连接了

    private static final ProxyMessage HEART_BEAT = new ProxyMessage(ProxyMessage.TYPE_KEEPALIVE);

    private EventLoopGroup workerGroup = null;

    public HeartBeatHandler (EventLoopGroup workerGroup) {
        this.workerGroup = workerGroup;
    }

    public HeartBeatHandler () {

    }

    /**
     * @Description 写超时 触发   发送心跳包
     * @param ctx
     * @param evt
     * @throws Exception
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        ctx.writeAndFlush(HEART_BEAT);
        log.info("写超时,发送心跳连接包");
    }


    /*
    连接异常
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        workerGroup.shutdownGracefully();
        ctx.fireExceptionCaught(cause);
        ctx.channel().close();
        log.info("内网客户端异常, 连接中断");
    }
}
